package local;

import java.util.ArrayList;

public class local {
	
	void solRandom(BiGrafo big){
		for(Node n : big.iv1){
			big.v1.add((int)(Math.random()*100)%big.v1.size(), n);
		}
		
		for(Node n : big.iv2){
			big.v2.add((int)(Math.random()*100)%big.v2.size(), n);
		}
		
		big.iv1.clear();
		big.iv2.clear();
		
	}
	public void Busqlocal(BiGrafo big, int contador){
		System.out.println("Inicio Local...");
		int mejorI = -1;
		int mejorJ = -1;
		boolean mejorEnV1 = true;						//si hizo swap en V1 o V2
		int mejorCantCortes = big.cantidadCruces();
		int cortesAntes = 0;
		int cortesDespues = 0;
		
		boolean mejoro = true;							//si pudo mejorar
		
		for(int hasta = contador; hasta>0 && mejoro;hasta--){
			/*
			for(int i = 0; i < big.v1.size()-1;i++){			//swap dentro de V1
				if(!big.v1.get(i).fijo && !big.v1.get(i+1).fijo){
					swap(big.v1,i,i+1);							//swap!
					int cantidadCruces = cantidadCruces(big);
					if(cantidadCruces < mejorCantCruces){
						mejorCantCruces = cantidadCruces;
						mejorI = i;
					}
					swap(big.v1,i+1,i);							//restablesco swap
				}
			}
		
		
			for(int i = 0; i < big.v2.size()-1;i++){			//swap dentro de V2
				if(!big.v2.get(i).fijo && !big.v2.get(i+1).fijo){
					swap(big.v2,i,i+1);							//swap!
					int cantidadCruces = cantidadCruces(big);
					if(cantidadCruces < mejorCantCruces){
						mejorCantCruces = cantidadCruces;
						mejorI = i;
					}
					swap(big.v2,i+1,i);							//restablesco swap
				}
			}
		 */
			
			mejoro = false;
			//Mover nodos dentro de V1
			for(int i = 0; i < big.v1.size()-1;i++){
				if(!big.v1.get(i).fijo && !big.v1.get(i+1).fijo){
					for(int j = 0; j < big.v1.size()-1;j++){
						if(i != j){
							cortesAntes = big.CortesDeV1(i);
							insertar(big.v1,i,j);					//muevo el nodo de i a j
							if(i<j)
								cortesDespues = big.CortesDeV1(j-1);
							else
								cortesDespues = big.CortesDeV1(j);
							if(cortesAntes > cortesDespues){
								if(cortesDespues < mejorCantCortes){
									mejorCantCortes = cortesDespues;
									mejorI = i;
									mejorJ = j;
									mejorEnV1 = true;
									mejoro = true;
								}
							}
						
							restablecer(big,big.v1,j,i);				//muevo el nodo de j a i
						
						}
					
					}
				
				}
			}
		
			// Mover nodos dentro de V2
			for(int i = 0; i < big.v2.size()-1;i++){
				if(!big.v2.get(i).fijo && !big.v2.get(i+1).fijo){
					for(int j = 0; j < big.v2.size()-1;j++){
						if(i != j){
							cortesAntes = big.CortesDeV2(i);
							insertar(big.v2,i,j);					//muevo el nodo de i a j
							if(i<j)
								cortesDespues = big.CortesDeV2(j-1);
							else
								cortesDespues = big.CortesDeV2(j);
							if(cortesAntes > cortesDespues){
								if(cortesDespues < mejorCantCortes){
									mejorCantCortes = cortesDespues;
									mejorI = i;
									mejorJ = j;
									mejorEnV1 = false;
									mejoro = true;
								}
							}
							restablecer(big,big.v2,j,i);				//muevo el nodo de j a i
						
						}
					
					}
				
				}
			}
		
		//	Actualizo Solucion
			if(mejoro){
				
				System.out.println("Mejoro");
				if(mejorEnV1)
					insertar(big.v1,mejorI,mejorJ);	
				else
					insertar(big.v2,mejorI,mejorJ);
			}
			else
				System.out.println("no Mejoro");
		}
	}
	
	private static void insertar(ArrayList<Node> v, int i, int j){
		Node n = v.get(i);
		v.remove(i);
		if(i<j){
			v.add(j-1, n);
		}
		else{
			v.add(j, n);
		}
	}
	
	private static void restablecer(BiGrafo big, ArrayList<Node> v, int j, int i){

		if(j<i){
			Node n = v.get(j);
			v.remove(j);
			v.add(i, n);
		}
		else{
			Node n = v.get(j-1);
			v.remove(j-1);
			v.add(i, n);
		}
		
	}
	
	
}
